package cn.com.landsky.alarm.common.utils;

import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/***
 ** @Description: ReflexUtil 反射工具类
 ** @author: qing.yunhui
 ** @email: 280672161@.qq.com
 ** @dateTime: Nov 20, 2015 10:15:50 AM
 ** @version: V1.0
 ***/
public class ReflexUtil {
	
	/**
	 * <p>从jsonObj的值copy到obj中，注意jsonObj中的key(属性)要与obj中字段保持一致</p>
	 * @param obj 待处理的对象
	 * @param jsonObj 待操作的对象
	 * @return void
	 * */
	public static void setObjectValue(Object obj,JSONObject jsonObj){
		if(null==obj||null==jsonObj){ return;}
		//得到所有已声明的的属性字段。
		Field[] fields=obj.getClass().getDeclaredFields();
		for(Field field:fields){
			try {
				String name=field.getName();
				String value=jsonObj.getString(name);
				if(!StringUtil.isEmpty(value)){
					field.setAccessible(true);
					Class<?> clz=field.getType();
					if(clz.equals(Date.class)){
						field.set(obj, DateUtil.getDateByStr(value));
					}else if(clz.equals(Integer.class) || clz.equals(int.class)){
						field.set(obj, Integer.parseInt(value));
					}else if(clz.equals(Long.class) || clz.equals(long.class)){
						field.set(obj, Long.parseLong(value));
					}else if(clz.equals(Double.class) || clz.equals(double.class)){
						field.set(obj, Double.parseDouble(value));
					}else{
						field.set(obj, value);
					}
				}
			} catch (Exception e) {
				continue;
			} 
		}
	}
	
	/**
	 * 对象到map转换、只有当obj对象中的值不为null或空的时候才会被放到map中。
	 * @param obj 待转换的对象
	 * @return 转换后的map对象。
	 * **/
	public static Map<String,Object> clzToMap(Object obj){
		Map<String,Object> map=new HashMap<String,Object>();
		if(null==obj){
			return map;
		}
		Field[] fields=obj.getClass().getDeclaredFields();
		for(Field field:fields){
			try {
				Method method=obj.getClass().getMethod("get"+StringUtil.firstLetterConvert(field.getName(), true));
				Object object=method.invoke(obj);
				if(null!=object && !StringUtil.isEmpty(object)){
					map.put(field.getName(), object);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} 
		}
		return map;
	}

}
